package cn.funeralobjects.upms.service;

import java.util.Collection;
import java.util.List;

/**
 * 权限业务
 *
 * @author FuneralObjects
 * Create date: 2020/4/24 11:29 AM
 */
public interface PermissionService {

    /**
     * 添加用户到组
     *
     * @param userIds 用户id集合
     * @param groupId 组id
     */
    void addUserToGroup(Collection<Integer> userIds, Integer groupId);

    /**
     * 添加用户到组
     *
     * @param userId  用户id
     * @param groupId 组id
     */
    void addUserToGroup(Integer userId, Integer groupId);

    /**
     * 添加用户到组
     *
     * @param userId   用户id
     * @param groupIds 组id集合
     */
    void addUserToGroup(Integer userId, Collection<Integer> groupIds);

    /**
     * 添加角色到用户
     *
     * @param roleIds 角色id集合
     * @param userId  用户id
     */
    void addRoleToUser(Collection<Integer> roleIds, Integer userId);

    /**
     * 添加角色到用户
     *
     * @param roleId 角色id
     * @param userId 用户id
     */
    void addRoleToUser(Integer roleId, Integer userId);

    /**
     * 添加角色到用户
     *
     * @param roleId  角色id
     * @param userIds 用户id集合
     */
    void addRoleToUser(Integer roleId, Collection<Integer> userIds);

    /**
     * 移除角色用户的关联关系
     *
     * @param userId 用户id
     * @param roleId 角色id
     */
    void removeRoleFromUser(Integer userId, Integer roleId);

    /**
     * 清空某用户下的角色
     *
     * @param userId 用户id
     */
    void removeAllRolesFromUser(Integer userId);

    /**
     * 清空某角色下的用户
     *
     * @param roleId 角色id
     */
    void removeAllUsersFromRole(Integer roleId);

    /**
     * 移除用户和组的关联关系
     *
     * @param groupId 组id
     * @param userId  用户id
     */
    void removeUserFromGroup(Integer groupId, Integer userId);

    /**
     * 清空某用户下的组
     *
     * @param userId 用户id
     */
    void removeAllGroupsFromUser(Integer userId);

    /**
     * 清空某组下面的用户
     *
     * @param groupId 组id
     */
    void removeAllUsersFromGroup(Integer groupId);

    /**
     * 添加角色到api下
     *
     * @param roleId 角色id
     * @param apiId  apiId
     */
    void addRoleToApi(Integer roleId, Integer apiId);

    /**
     * 移除角色api的关联关系
     *
     * @param roleId 角色id
     * @param apiId  apiId
     */
    void removeRoleFromApi(Integer roleId, Integer apiId);

    /**
     * 清空某个api下的所有角色
     *
     * @param apiId apiId
     */
    void removeAllRolesFromApi(Integer apiId);

    /**
     * 判断用户是否存在角色
     *
     * @param userId 用户id
     * @param roleId 角色id
     * @return true - 存在
     */
    boolean existsRoleFromUser(Integer userId, Integer roleId);

    /**
     * 判断用户是否存在所有角色
     *
     * @param userId  用户id
     * @param roleIds 角色id集合
     * @return true - 存在
     */
    boolean existsAllRolesFromUser(Integer userId, Collection<Integer> roleIds);

    /**
     * 判断角色是否存在用户
     *
     * @param roleId  角色id
     * @param userIds 用户id集合
     * @return true - 存在
     */
    boolean existsAllUsersFromRole(Integer roleId, Collection<Integer> userIds);

    /**
     * 判断组是否存在用户
     *
     * @param groupId 组id
     * @param userId  用户id集合
     * @return true - 存在
     */
    boolean existsUserFromGroup(Integer groupId, Integer userId);

    /**
     * 判断是组是否存在所有用户
     *
     * @param groupId 组id
     * @param userIds 用户id集合
     * @return true - 存在
     */
    boolean existsAllUsersFromGroup(Integer groupId, Collection<Integer> userIds);

    /**
     * 判断用户是否存在于所有组
     *
     * @param userId   用户id
     * @param groupIds 组id集合
     * @return true - 存在
     */
    boolean existsAllGroupsFromUser(Integer userId, Collection<Integer> groupIds);

    /**
     * 判断api是否存在角色
     *
     * @param roleId 角色id
     * @param apiId  apiId
     * @return true - 存在
     */
    boolean existsRoleFromApi(Integer roleId, Integer apiId);

    /**
     * 判断api否是存在所有角色
     *
     * @param apiId   apiId
     * @param roleIds 角色id集合
     * @return true - 存在
     */
    boolean existsAllRolesFromApi(Integer apiId, Collection<Integer> roleIds);

    /**
     * 判断角色是否存在所有api
     *
     * @param roleId 角色ID
     * @param apiIds apiId集合
     * @return true - 存在
     */
    boolean existsAllApiFromRole(Integer roleId, Collection<Integer> apiIds);

    List<Integer> findUserIdFromRoleId(Integer roleId);

    List<Integer> findRoleIdFromUserId(Integer userId);

    List<Integer> findApiIdFromRoleId(Integer roleId);

}
